// 导入类型
import { TaskHandler, EventHandler, TaskQueue } from './types';

// 任务系统类
export class TaskSystem {
  // 执行任务
  async executeTask(task: TaskHandler, params: any = {}) {
    try {
      // 创建任务
      await task.create(params)

      // 启动任务
      await task.start(params)

      // 等待任务完成
      const result = await this.waitForCompletion()

      // 处理任务完成
      await task.onFinish(result, params)

      return result
    } catch (error) {
      // 处理任务失败
      console.error('任务失败', error)
      await task.onFail(error, params)

      // 确保抛出的是Error对象
      if (error instanceof Error) {
        throw error;
      } else {
        throw new Error(typeof error === 'object' && error !== null
          ? (error as any).message || JSON.stringify(error)
          : String(error));
      }
    }
  }

  // 任务队列执行
  async executeTaskSequence(taskQueue: TaskQueue) {
    const results: any[] = []

    for (const { task, params } of taskQueue) {
      const result = await this.executeTask(task, params)
      results.push(result)
    }

    return results
  }

  // 等待任务完成的Promise
  private waitForCompletion() {
    return new Promise((resolve, reject) => {
      // 设置任务完成的事件监听器
      const onFinished = (result: any) => {
        resolve(result)
        // 清理监听器
        this.unsubscribeEvent('sig_task_finished', onFinished)
        this.unsubscribeEvent('sig_task_start_failed', onFailed)
      }

      const onFailed = (error: any) => {
        // 确保拒绝原因是Error对象
        if (error instanceof Error) {
          reject(error);
        } else {
          reject(new Error(typeof error === 'object' && error !== null
            ? (error as any).message || JSON.stringify(error)
            : String(error)));
        }
        // 清理监听器
        this.unsubscribeEvent('sig_task_finished', onFinished)
        this.unsubscribeEvent('sig_task_start_failed', onFailed)
      }

      // 注册事件监听器
      this.subscribeEvent('sig_task_finished', onFinished)
      this.subscribeEvent('sig_task_start_failed', onFailed)

      // 模拟任务完成
      setTimeout(() => {
        onFinished({ success: true, message: '任务完成' })
      }, 1000)
    })
  }

  private subscribeEvent(_eventName: string, _handler: EventHandler) {
    // 绑定到现有的事件系统
    console.log(`订阅事件: ${_eventName}`)
  }

  private unsubscribeEvent(_eventName: string, _handler: EventHandler) {
    // 从现有的事件系统解绑
    console.log(`取消订阅事件: ${_eventName}`)
  }
}

// 创建任务系统实例
export const taskSystem = new TaskSystem();

// 任务队列执行函数
export async function executeTaskQueue(taskQueue: TaskQueue) {
  const results = await taskSystem.executeTaskSequence(taskQueue)
  console.log('工作流完成:', results)
} 